// Configiurazione del dominio del server
module EntityCondivise
{
//************************ DICHIARAZIONI ************************//
//Sezione gerarchia dei lavori
	class EProgetto;
	class ESottoprogetto;
	class ETask;
	class ETimeRecord;
	class EDipendenza;	
	class ETaskStato;
	
//Sezione gerarchia degli attori
	class EDipendente;
	class ECliente;
	
//Sezione Fattura
	class EMoney;
	class EFattura;
	class ELineaFattura;
	class ERegola;
	class ECalcoloStrategy;
	
//Sezione Notifiche

	class ENotifica;
		
	["java:type:java.util.ArrayList<EntityCondivise.EDipendenza>:java.util.List<EntityCondivise.EDipendenza>"] sequence<::EntityCondivise::EDipendenza> dipendenzeLista;
	["java:type:java.util.ArrayList<EntityCondivise.ETimeRecord>:java.util.List<EntityCondivise.ETimeRecord>"] sequence<::EntityCondivise::ETimeRecord> timerecordsLista;		
	["java:type:java.util.ArrayList<EntityCondivise.ETask>:java.util.List<EntityCondivise.ETask>"] sequence<::EntityCondivise::ETask> taskLista;
	["java:type:java.util.ArrayList<EntityCondivise.ESottoprogetto>:java.util.List<EntityCondivise.ESottoprogetto>"] sequence<::EntityCondivise::ESottoprogetto> sottoprogettoLista;
	["java:type:java.util.ArrayList<EntityCondivise.ELineaFattura>:java.util.List<EntityCondivise.ELineaFattura>"] sequence<::EntityCondivise::ELineaFattura> lineaRegolaLista;

//************************ IMPLEMENTAZIONI ************************//

//Sezione gerarchia dei lavori

	class ETask
	{
		int id;
		
		string inizio;
		string fine;
		
		string titolo;
		
		::EntityCondivise::EMoney budget;		
		::EntityCondivise::EMoney costo;		
		::EntityCondivise::EMoney costoOrario;
		
		::EntityCondivise::ETaskStato statoObj;
				
		::EntityCondivise::EDipendente consulenteAttuale;		
		dipendenzeLista dipendenze;
		timerecordsLista timerecords;
		
	};	
	
	class ETaskStato
	{
		::EntityCondivise::ETask task;
	};
	
	class ETaskPianificato extends ETaskStato {};
	class ETaskIniziato extends ETaskStato {};
	class ETaskAvviato extends ETaskStato {};
	class ETaskConcluso extends ETaskStato {};

	class ETimeRecord
	{
		int id;
		string inizio;
		string fine;
		string testo;
		
		::EntityCondivise::EMoney costo;		
		::EntityCondivise::EMoney costoOrario;
		
		::EntityCondivise::EDipendente consulente;
		
		bool corrente;	
	};
	
	class EDipendenza
	{
		int id;
		ETask padre;
		ETask figlio;
	};
	
	class ESottoprogetto
	{
		int id;
		string nome;
		string inizio;
		string scadenza;
		
		taskLista tasks;
		
		::EntityCondivise::EMoney budget;		
		::EntityCondivise::EMoney costo;
		
		::EntityCondivise::EDipendente manager;
	};

	class EProgetto
	{
		int id;
		string nome;
		string descrizione;
		string inizio;
		string scadenza;
		
		::EntityCondivise::EMoney budget;		
		::EntityCondivise::EMoney costo;		
		
		sottoprogettoLista sottoprogetti;
	};

//Sezione gerarchia degli attori

	class EDipendente
	{
		int matricola;
		
		string username;
		string password;
				
		string nome;
		string cognome;
		
		string discriminator;

	};
	class EConsulente extends EDipendente {};
	class EManager extends EDipendente {};
	class EProprietario extends EDipendente {};
	
	class ECliente
	{
		int id;
		int recapito;
	};
	class EAzienda extends ECliente
	{
		string nome;
	};
	class EPrivato extends ECliente
	{
		string nome;
		string cognome;
	};

//Sezione Fattura

	class EMoney
	{
		int id;
		int prezzo;
		string valuta;
	};
	
	class ELineaFattura 
	{
		int costo;
		string descrizione;
		string misura;		
	};

	class ELineaRegola extends ELineaFattura 
	{
		string segno;
	};

	class ELineaTimeRecord extends ELineaFattura {};
	["java:type:java.util.ArrayList<EntityCondivise.ELineaTimeRecord>:java.util.List<EntityCondivise.ELineaTimeRecord>"] sequence<::EntityCondivise::ELineaTimeRecord> lineaTimeRecordLista;

	class ELineaTask extends ELineaFattura 
	{
		lineaTimeRecordLista lineeTimeRecord;
	};	
	["java:type:java.util.ArrayList<EntityCondivise.ELineaTask>:java.util.List<EntityCondivise.ELineaTask>"] sequence<::EntityCondivise::ELineaTask> lineaTaskLista;
	
	class ELineaSottoprogetto extends ELineaFattura 
	{
		lineaTaskLista lineeTask;
	};
	["java:type:java.util.ArrayList<EntityCondivise.ELineaSottoprogetto>:java.util.List<EntityCondivise.ELineaSottoprogetto>"] sequence<::EntityCondivise::ELineaSottoprogetto> lineaSottoprogettoLista;
		
	class ELineaProgetto extends ELineaFattura 
	{
		lineaSottoprogettoLista lineeSottoprogetto;
	};	

	class ERegola
	{
		int valore;
		string nome;
		string segno;
	};
	class EScontoFissoRegola extends ERegola { };
	class EScontoPercentualeRegola extends ERegola { };
	class EImposteRegola extends ERegola { };
	
	["java:type:java.util.ArrayList<EntityCondivise.ERegola>:java.util.List<EntityCondivise.ERegola>"] sequence<::EntityCondivise::ERegola> regolaLista;	
	class ECalcoloStrategy
	{
		regolaLista regole;
	};
	class ENoRegolaCalcolo extends ECalcoloStrategy { };
	class ENoImpostaCalcolo extends ECalcoloStrategy { };
	class EOgniRegolaCalcolo extends ECalcoloStrategy { };

	class EFattura
	{
		int id;
		string dataEmissione;
		
		::EntityCondivise::EMoney totale;
		::EntityCondivise::EProgetto progetto;
		::EntityCondivise::ELineaProgetto lineaFattura;
		
		lineaRegolaLista regoleFattura;
	};
	
//Sezione Notifiche

	class ENotifica
	{
		int id;
		string testo;
		
	};

	class ENotificaSottoprogetto extends ENotifica
	{
		::EntityCondivise::ESottoprogetto sottoprogetto;
		::EntityCondivise::EManager manager;

	};
	
	class ENotificaTask extends ENotifica
	{		
		::EntityCondivise::ETask task;
		::EntityCondivise::EConsulente consulente;
		
	};
	
	class ENotificaSottoprogettoAssegnato extends ENotificaSottoprogetto {};
	class ENotificaSottoprogettoModificato extends ENotificaSottoprogetto {};
	class ENotificaSottoprogettoRevocato extends ENotificaSottoprogetto {};
	
	class ENotificaTaskAssegnato extends ENotificaTask {};
	class ENotificaTaskModificato extends ENotificaTask {};
	class ENotificaTaskRevocato extends ENotificaTask {};
};

module InterfacceCondivise
{

	["java:type:java.util.ArrayList<EntityCondivise.ETimeRecord>:java.util.ArrayList<EntityCondivise.ETimeRecord>"] sequence<::EntityCondivise::ETimeRecord> timerecordsLista;		
	["java:type:java.util.ArrayList<EntityCondivise.ETask>:java.util.ArrayList<EntityCondivise.ETask>"] sequence<::EntityCondivise::ETask> taskLista;		
	["java:type:java.util.ArrayList<Ice.Object>:java.util.ArrayList<Ice.Object>"] sequence<Object> genericaLista;
	["java:type:java.util.ArrayList<EntityCondivise.ESottoprogetto>:java.util.ArrayList<EntityCondivise.ESottoprogetto>"] sequence<::EntityCondivise::ESottoprogetto> sottoprogettoLista;
	["java:type:java.util.ArrayList<EntityCondivise.EDipendenza>:java.util.ArrayList<EntityCondivise.EDipendenza>"] sequence<::EntityCondivise::EDipendenza> dipendenzeLista;		
	["java:type:java.util.ArrayList<EntityCondivise.ENotificaTaskAssegnato>:java.util.ArrayList<EntityCondivise.ENotificaTaskAssegnato>"] sequence<::EntityCondivise::ENotificaTaskAssegnato> notificaTaskAssegnatoLista;		
	["java:type:java.util.ArrayList<EntityCondivise.ENotificaTaskRevocato>:java.util.ArrayList<EntityCondivise.ENotificaTaskRevocato>"] sequence<::EntityCondivise::ENotificaTaskRevocato> notificaTaskRevocatoLista;
	["java:type:java.util.ArrayList<EntityCondivise.ENotificaSottoprogettoAssegnato>:java.util.ArrayList<EntityCondivise.ENotificaSottoprogettoAssegnato>"] sequence<::EntityCondivise::ENotificaSottoprogettoAssegnato> notificaLista;
	
	
	class FdbClient;
	class CAutenticazione;
	class XMLFacade;
	
	class CAutenticazione
	{
		bool autentica(string nome, string password);
	};
	
	class FdbClient
	{		
		timerecordsLista getTimeRecordList(EntityCondivise::EDipendente consulente);
		taskLista getTaskList(EntityCondivise::EDipendente consulente);
		
		EntityCondivise::EDipendente getDipendenteByUsername(string username);
		EntityCondivise::ESottoprogetto getSottoprogetto(EntityCondivise::ETask task);
		EntityCondivise::EProgetto getProgetto(EntityCondivise::ETask task);	
		
		/////////////////funzioni per manager	
		EntityCondivise::EProgetto getProgettobyTask(EntityCondivise::ETask task);
		genericaLista getList(string classe);
		sottoprogettoLista getSottoprogetti(EntityCondivise::EManager managerIce);
	 	dipendenzeLista getDipendenzeFiglio(EntityCondivise::ETask task);
		dipendenzeLista getDipendenzePadre(EntityCondivise::ETask task);
		notificaTaskAssegnatoLista getNotificheAssegnato(EntityCondivise::ETask task);
		notificaTaskRevocatoLista getNotificheRevocato(EntityCondivise::ETask task);
		EntityCondivise::EProgetto getProgettobySottoprogetto(EntityCondivise::ESottoprogetto sottoprogetto);	
		
		/////////////////funzioni per proprietario
		notificaLista getNotifiche(EntityCondivise::ESottoprogetto sottoprogetto);
		EntityCondivise::EFattura getFatturaByProgetto(EntityCondivise::EProgetto progetto);
		
		int save(Object obj);
		void update(Object obj);
		Object load(string classe, int id);
		void delete(Object obj);
		
	};
	
	class XMLFacade
	{
		EntityCondivise::ECalcoloStrategy getCalcoloStrategy(); 
	};
};

